#include "imageview.h"
#include <QFileDialog>
#include <QRect>
#include <QDebug>
ImageView::ImageView(QWidget *parent)
    : QWidget{parent}
{}
/**
 * 图片绘制函数
 * @brief ImageView::paintEvent
 * @param e
 */
void ImageView::paintEvent(QPaintEvent *e)
{
    if(src.isNull())return;
    QPainter p(this);
    p.translate(width()/2, height()/2);//重新设置坐标中心点
    // p->scale(1, -1);
    p.rotate(rotateValue);//图片旋转
    p.scale(scaleValue, scaleValue);//图片缩放
    // p.setPen(QPen(Qt::red, 2));
    // if(status){
    //     if(type == 1){ //1绘制矩形
    //         p.drawRect(QRect(x1, y1, x2 - x1, y2 - y1));
    //     }else if(type == 2){//2绘制圆形
    //         p.drawEllipse(x1/2,y1/2,x2,y2);
    //     }
    // }
    p.drawPixmap(-src.width()/2, -src.height()/2, src);//图片绘制
}
/**
 * 鼠标每次移动重新绘制图像
 * @brief ImageView::mouseMoveEvent
 * @param ev
 */
void ImageView::mouseMoveEvent(QMouseEvent *ev){
    if(src.isNull()) return;
    QPointF startPos = convertPoint(ev->pos()); //转换坐标
    x2 = startPos.x();//获取转换后的x轴的值
    y2 = startPos.y();//获取转换后的y轴的值
    QPainter p(&src); //创建QPainter对象，用于图像绘制
    p.setPen(QPen(Qt::red, 2));//设置画笔
    p.translate(src.width()/2, src.height()/2);//以图像的中心点进行绘制
    if(status){
        if(type == 1){ //1绘制矩形
            p.drawRect(QRect(x1, y1, x2 - x1, y2 - y1));
        }else if(type == 2){//2绘制圆形
            p.drawEllipse(x1/2,y1/2,x2,y2);
        }
    }
    //获取当前的鼠标下的RGB值
    QColor color = src.toImage().convertToFormat(QImage::Format_ARGB32).pixelColor(ev->pos());
    emit colorHovered(color);
    update();//刷新图像
}
/**
 * 获取鼠标第一次左点击的坐标
 * @brief ImageView::mousePressEvent
 * @param ev
 */
void ImageView::mousePressEvent(QMouseEvent *ev){
    if(ev->button() == Qt::LeftButton){
        QPointF startPos = convertPoint(ev->pos());//转换当前鼠标的坐标
        x1 = startPos.x();//转换后的x坐标
        y1 = startPos.y();//转换后的Y坐标
        status = true;//当前鼠标被按下
        update();
    }
}
/**
 * 鼠标按下被释放时，状态修改
 * @brief ImageView::mouseReleaseEvent
 * @param ev
 */
void ImageView::mouseReleaseEvent(QMouseEvent *ev){
    status = false;
}
/**
 * 打开文件
 * @brief ImageView::openFile
 */
void ImageView::openFile()
{
    QString fileName = QFileDialog::getOpenFileName(this,"打开文件");
    qDebug() << fileName;
    if(fileName.isNull()) return;
    if(!src.load(fileName)) return;
    update();
}
/**
 * 通过界面上的旋转按钮，设置旋转角度
 * @brief ImageView::turnImage
 * @param v
 */
void ImageView::turnImage(int v)
{
    rotateValue = v;
    update();
    qDebug() << v;
}
/**
 * 通过界面上的缩放按钮，设置缩放比例
 * @brief ImageView::turnImage
 * @param v
 */
void ImageView::scaleImage(int v)
{
    qreal tmp = v / 100.0;
    scaleValue = qBound(0.1, tmp, 3.0);
    update();
    qDebug() << scaleValue << " " << tmp;
}
/**
 * 平移动画
 * @brief ImageView::moveAnimation
 */
void ImageView::moveAnimation()
{
    if(src.isNull()) return;
    animation.setTargetObject(this);//设置当前平移的对象
    animation.setEasingCurve(QEasingCurve::Linear);
    animation.setPropertyName("pos");//设置属性名称
    animation.setDuration(3000);//设置间隔时间
    animation.setStartValue(this->pos());//设置移动开始位置
    animation.setEndValue(this->pos() + QPoint(200, 100));//设置移动的结束位置
    animation.start();//开始动画
    qDebug() << "moveAnimation" ;
}
void ImageView::drawRect(){
    type = 1;
    qDebug() << "drawRect" ;
}
void ImageView::drawEllipse(){
    type = 2;
    qDebug() << "drawEllipse" ;
}
// 坐标转换函数
QPointF ImageView::convertPoint(const QPoint& p) {
    return QPointF(p.x()- width()/2.0,
                    p.y() - height()/2.0);
}
